파이썬 (0323) 4주차

딕셔너리
집합
Author

김보람

Published

March 23, 2022

연산

- 하나있다.`

score={'boram':49, 'iu':80}
score
{'boram': 49, 'iu': 80}
'boram' in score
True

'iu' in score
True
'hynn' in score
False

- in은 사실 다른 자료형도 가능하다`

(관찰1)

'a' in 'boram'
True
'c' in 'boram'
False

(관찰2)

tpl = 1,2,3
tpl
(1, 2, 3)
1 in tpl
True
4 in tpl
False

(관찰3)

score=[['boram',49], ['iu',80]]
score
[['boram', 49], ['iu', 80]]
['boram', 49] in score
True

- in 연산자가 dict형에 사용되면 key를 기준으로 True, False을 판단한다.

메소드

(get)

score={'boram':49, 'iu':80}
score
{'boram': 49, 'iu': 80}
score.get('boram')
49

아래와 같은 기능

score['boram']
49

미묘한 차이점이 존재함

score['hynn']  # hynn이 없어서 키에러 출력, 그런 key는 없다..
KeyError: 'hynn'
score.get('hynn')  #hynn이 없으면 아무것도 출력안함

(kyes, values, items)

-.keys()는 딕셔너리의 키를 리턴한다.

score={'boram':49, 'iu':80}
score
{'boram': 49, 'iu': 80}
?score.keys
_keys=score.keys()
_keys
dict_keys(['boram', 'iu'])
type(_keys)   # 모르는 자료형이지만, list나 tuple과 같이 자료형을 바꿀수 있다.
dict_keys
list(_keys)  # 아무튼 그 이상한 자료형도 리스트화가 가능
['boram', 'iu']

-.values()는 딕셔너리의 키를 리턴한다.

_values=score.values()
_values
dict_values([49, 80])
type(_values)
dict_values
list(_values)
[49, 80]

-.items()는 딕셔너리의 키를 리턴한다.

_items=score.items()
_items
dict_items([('boram', 49), ('iu', 80)])
type(_items)
dict_items
list(_items)
[('boram', 49), ('iu', 80)]

- for문에서의 dict

(예시1)

for i in score.keys():
    print(i)
boram
iu
for i in score:
    print(i)
boram
iu
  • 딕셔너리 그자체도 for문에 넣을 수 있다.
  • i에는 value가 삭제되어 들어간다. (즉 key만)
  • 결과를 보면 score대신에 score.keys()와 list(score)를 넣었을때와 결과가 같다.

Note: list(score)하면 key만 리턴된다.

(예시2)

for i in score.values():
    print(i)
49
80

(예시3)

for k in score.items():
    print(k)
('boram', 49)
('iu', 80)

(예시4)

for i,j in score.items():
    print(i,j)
boram 49
iu 80

(예시5)

for i,j in score.items():
    print(i + '의 중간고사 점수는 %s점입니다' %j)
boram의 중간고사 점수는 49점입니다
iu의 중간고사 점수는 80점입니다

[보충학습] 문자열 새치기

'제 이름은 %s입니다.'  % '김보람' 
'제 이름은 김보람입니다.'
'제 이름은 %s입니다.'  % [1,2]
'제 이름은 [1, 2]입니다.'
1+1
2
[1,2]+[3,4]
[1, 2, 3, 4]
  • %는 새치기연산자임. %s는 새치기하는 자리라고 생각

보충학습끝

딕셔너리 고급

키는 문자열만 가능한 것이 아니다.

- 정수키

score = {0:49, 1:80, 1:99} # key를 0,1,2로
score
{0: 49, 1: 99}

- 인덱싱은?

score[0] # 키로 인덱싱을 하고 있는데 마치 원소의 위치로 인덱싱을 하는 기분
49

- 그럼 혹시 이것도?

score[:2]
TypeError: unhashable type: 'slice'
score[-1]   # 될리가 없지..
KeyError: -1

- key로 가능한 것이 문자열만 가능한 것이 아니라 다른 것도 가능하다. (숫자,튜플,,)

(예시)

score={(0,'boram'):49, (1, 'iu'):80, (2, 'hynn'):99}
score
{(0, 'boram'): 49, (1, 'iu'): 80, (2, 'hynn'): 99}
score[(0,'boram')]
49
score[0,'boram'] #tuple이니까 가로 생략 가능
49

(예시)

score={('boram',0):10, ('boram',1):20, ('boram',2):30} #0은 출석점수, 1은 레포트 점수, 2는 중간고사 점수
score
{('boram', 0): 10, ('boram', 1): 20, ('boram', 2): 30}
score[('boram',0)]
10
score['boram',0]
10
score[('broam,3')] = 99  # 보람의 기말고사 점수를 추가
score
{('boram', 0): 10, ('boram', 1): 20, ('boram', 2): 30, 'broam,3': 99}

- 문자열, 숫자값, 튜플의 공통점? 불변객체

a=11
a=22  # 22로 수정된 것이 아니고 재할당된것임..
a
22
a='boram'
a='Broam'
a  # 이것도 재할당..
'Broam'
a[0]
'B'
a[0]='b'  # 문자열 불변
TypeError: 'str' object does not support item assignment
# 수정이랑 재할당을 구분하는 방법 -> 메모리 주소 값을 찍어보면 된다.

[참고로만]

(인트형은 불변)

a=1
a, id(a)
(1, 2254873389360)
a=2
a, id(a)
(2, 2254873389392)

(문자열도 불변)

a='boram'
a, id(a)
('boram', 2254959000432)
a='Boram'
a, id(a)
('Boram', 2254988509296)

(리스트는 가변)

a=list('boram')
a, id(a)
(['b', 'o', 'r', 'a', 'm'], 2254989018304)
a[0]='B'
a,id(a)   #id가 같다. 편집!
(['B', 'o', 'r', 'a', 'm'], 2254989018304)

집합

선언

a={'notebook', 'desktop'}

원소추출

- 일단 인덱스로는 못한다.

a={'notebook', 'desktop'}
a[0]
TypeError: 'set' object is not subscriptable

- 딱히 하는 방법이 없다. 그리고 이걸 하는 의미가 없다. 원소에 접근해서 뭐하려고…!!

원소추가

- 이건 의미가 있다.

a={'notebook', 'desktop'}
a.add('ipad')
a
{'desktop', 'ipad', 'notebook'}
a.add('notebook') # 이미 원소로 있는 건 추가 되지 않음
a
{'desktop', 'ipad', 'notebook'}

원소삭제

a.remove('notebook')
a
{'desktop', 'ipad'}

연산

- in 연산자

1 in [1,2,3,4]
True
5 in [1,2,3,4]
False
a=('desktop','ipad','notebook')
a
('desktop', 'ipad', 'notebook')
'notebook' in a
True

- 참고로 in 연산자는 집합에서만 쓰는 것은 아님

- 합집합, 교집합, 차집합

day1 = {'notebook', 'desktop'}
day2 = {'notebook', 'ipad'}
day1 | day2   # 합집합
{'desktop', 'ipad', 'notebook'}
day1 & day2 # 교집합
{'notebook'}
day1 - day2  # 차집합
{'desktop'}
day2 - day1
{'ipad'}

- 부분집합

day1={'notebook','desktop'}
day2= day1 | {'ipad'}
day1
{'desktop', 'notebook'}
day2
{'desktop', 'ipad', 'notebook'}
day1<day2   # day1는 day2의 부분집합인가?
True
day2<day1
False

메소드

- 합집합

day1= {'notebook','desktop'}
day2 = {'notebook','ipad'}
day1.union(day2)
{'desktop', 'ipad', 'notebook'}
# 나머지 메소드는 스스로 찾아보세용

for문

day1= {'notebook','desktop'}
day2 = {'notebook','ipad'}
for i in day1|day2:
    print(i)
desktop
ipad
notebook

(숙제) 길이가 4인 집합을 두개만들고 공통원소를 2개로 설정한 뒤 합집합을 구하는 코드를 작성하라.

boram={'father','mother','me','coco'}
len(boram)
4
su={'father','mother','su','name'}
len(su)
4
boram | su
{'coco', 'father', 'me', 'mother', 'name', 'su'}